<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container :disabled="formDisabled">
      <!-- 主表单区域 -->
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <span style="color: red;">说明：1.政府采购品目：除例子外，需在一体化系统中查找填列，预算上报后，不允许调剂。
          2.政府采购预算编报范围：（1）集中采购目录内的；（2）100万元以上的货物和服务的项目，120万元以上的工程项目需要编报政府采购预算。
          3.政府采购预算中中小企业预留情况：参照《政府采购促进中小企业发展管理办法》（财库〔2020〕46号）和《关于进一步加大政府采购支持中小企业力度的通知》（财库〔2022〕19号）文件，
          采购限额标准以上，200万元以下的货物和服务采购项目、400万元以下的工程采购项目，适宜由中小企业提供的，应当专门面向中小企业采购；
          超过200万元的货物和服务采购项目、超过400万元的工程采购项目中适宜由中小企业提供的，预留该部分（该部分指的是适宜由中小企业提供的部分）
          采购项目预算总额30%（货物和服务）和40%（工程）以上专门面向中小企业采购，其中预留给小微企业的比例不低于60%。
          单位：万元
        </span>
        <a-row>
          <a-col :xs="24" :sm="12">
            <a-form-model-item label="采购预算项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmName">
              <a-input v-model="model.xmName" placeholder="请输入采购预算项目名称"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :xs="24" :sm="12">
            <a-form-model-item label="年度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="year">
              <j-dict-select-tag type="list" v-model="model.year" dictCode="year" placeholder="请选择年度"
                @change="handleYearChange" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
    <!-- 子表单区域 -->
    <a-tabs v-model="activeKey" @change="handleChangeTabs">
      <a-tab-pane tab="政府采购表" :key="refKeys[0]" :forceRender="true">
        <j-editable-table :ref="refKeys[0]" :loading="cwZfcgbTable.loading" :columns="cwZfcgbTable.columns"
          :dataSource="cwZfcgbTable.dataSource" :maxHeight="300" :disabled="formDisabled" :rowNumber="true"
          :rowSelection="true" :actionButton="true" @valueChange="handleTableValueChange" />
      </a-tab-pane>
    </a-tabs>
  </a-spin>
</template>

<script>
import { mapState } from 'vuex'

import { FormTypes, getRefPromise, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
import { validateDuplicateValue } from '@/utils/util'
import { getAction } from '@/api/manage'

export default {
  name: 'CwZfcgbTiForm',
  mixins: [JEditableTableModelMixin],
  components: {},
  data() {
    return {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      model: { year: '' }, // 初始为空，由watch同步全局年度
      validatorRules: {
        unit: [
          { required: true, message: '请输入单位!' },
        ],
        year: [
          { required: true, message: '请输入年度!' },
        ],
        xmName: [
          { required: true, message: '请输入采购预算项目名称!' },
        ],
      },
      addDefaultRowNum: 1,
      refKeys: ['cwZfcgb'],
      tableKeys: ['cwZfcgb'],
      activeKey: 'cwZfcgb',
      confirmLoading: false,
      // 政府采购表
      cwZfcgbTable: {
        loading: false,
        dataSource: [],
        columns: [
          // {
          //   title: '单位',
          //   key: 'unit',
          //   type: FormTypes.select,
          //   dictCode: "unit",
          //   width: "150px",
          //   placeholder: '请输入${title}',
          //   defaultValue: '',
          // },
          {
            title: '部门经济分类',
            key: 'bmjjfl',
            type: FormTypes.select,
            dictCode: "bmjjfl",
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '政府采购品目',
            key: 'zfcg',
            type: FormTypes.select,
            dictCode: "zfcg",
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '是否政府采购',
            key: 'sfzfcg',
            type: FormTypes.select,
            dictCode: "sfzfcg",
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '计量单位',
            key: 'jldw',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '数量',
            key: 'quantity',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '0',
            validateRules: [{ pattern: "z", message: "${title}格式不正确请输入整数" }],

          },
          {
            title: '单价(元)',
            key: 'univalence',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '总价（万元）',
            key: 'totalPrice',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.00',
            disabled: true, // 禁止手动编辑
            validateRules: [
              {
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确"
              }
            ],
          },
          {
            title: '财政拨款(万元)',
            key: 'fiscalAppropriation',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '财政专户管理资金(万元)',
            key: 'czzhglzj',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '非同级财政拨款资金(万元)',
            key: 'ftjczbk',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '其他资金(万元)',
            key: 'qtjz',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '上年结转(万元)',
            key: 'xnzj',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '采购类型',
            key: 'cglx',
            type: FormTypes.select,
            dictCode: "cglx",
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '是否适宜',
            key: 'suitable',
            type: FormTypes.select,
            dictCode: "suitable",
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '中小金额',
            key: 'zxje',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '中小比例',
            key: 'zxbl',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '小微金额',
            key: 'xwje',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '小微比例',
            key: 'xwbl',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '预留执行措施',
            key: 'ylzxcs',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '不适宜原因',
            key: 'bsiyy',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '说明',
            key: 'sm',
            type: FormTypes.input,
            width: "150px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
        ]
      },
      url: {
        add: "/cw/cwZfcgbTi/add",
        edit: "/cw/cwZfcgbTi/edit",
        cwZfcgb: { list: '/cw/cwZfcgbTi/queryCwZfcgbByMainId' },
        getByYear: '/cw/cwZfcgbTi/list' // 暂用CwTjForm的接口，后续可自行修改
      },
      isManualChange: false // 标记是否手动修改过表单年度

    }
  },
  props: {
    disabled: {
      type: Boolean,
      default: false,
      required: false
    },
    scene: { // 接收 Modal 传递的场景值
      type: String,
      default: ''
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    },
    ...mapState({ globalYear: state => state.app.globalYear })

  },
  watch: {
    // 监听全局年度变化，同步到表单（仅当未手动修改时）
    globalYear(newVal) {
      if (!this.isManualChange) {
        this.model.year = newVal
        // 可选：自动触发年度查询，解开注释即可
        // this.handleYearChange(newVal)
      }
    },
    // 监听表单年度变化，标记是否手动修改
    'model.year'(newVal, oldVal) {
      if (oldVal && newVal !== this.globalYear) {
        this.isManualChange = true // 手动修改后，不再同步全局年度
      }
    }
  },

  created() {
    // 初始化时同步全局年度
    this.model.year = this.globalYear
    const scene = this.scene; // 接收 Modal 传递的 scene（add/edit）
    this.currentScene = scene; // 存储到本地变量，后续复用
    console.log(scene)
    if (scene == 'add') {
      this.handleYearChange(this.model.year)
    }
  },
  methods: {
    handleTableValueChange({ row, column, value }) {
      // 1) 及时把编辑的值写回 dataSource（保证受控组件状态一致，避免第一次输入被重置）
      const ds = this.cwZfcgbTable.dataSource || [];
      const idx = ds.findIndex(item => item.id === row.id);
      if (idx !== -1) {
        // 使用 $set 保证响应式
        this.$set(this.cwZfcgbTable.dataSource[idx], column.key, value);
      } else {
        // 如果没有 id（新增行可能暂未有 id），直接修改对象引用也是可以的
        this.$set(row, column.key, value);
      }

      // 2) 防抖计算 totalPrice（只在需要列时触发）
      if (this.calcTimer) {
        clearTimeout(this.calcTimer);
      }
      this.calcTimer = setTimeout(() => {
        if (column.key === 'quantity' || column.key === 'univalence') {
          this.calcTotalPrice(row);
        }
      }, 50);
    },

    calcTotalPrice(row) {
      console.log("触发总价计算：", "行=", row);

      if (!row) {
        console.warn("行数据为空，无法计算");
        return;
      }

      try {
        // 更安全的数据提取方式
        const quantityStr = String(row.quantity || '0').trim();
        const unitPriceStr = String(row.univalence || '0.0').trim();

        // 验证数据有效性
        if (!quantityStr || !unitPriceStr) {
          console.warn("数量或单价为空，跳过计算");
          return;
        }

        // 转换数值（更严格的验证）
        const quantity = this.safeParseNumber(quantityStr);
        const univalence = this.safeParseNumber(unitPriceStr);

        console.log("计算参数：", "数量=", quantity, "单价=", univalence);

        // 计算总价
        const totalPrice = Math.round(quantity * univalence * 100 / 10000) / 100;

        if (isNaN(totalPrice)) {
          console.error("计算结果显示为NaN，跳过更新");
          return;
        }

        const totalPriceStr = totalPrice.toFixed(2);
        console.log("计算结果：", totalPriceStr);

        // 使用更可靠的更新方式
        this.updateTotalPriceInTable(row, totalPriceStr);

      } catch (error) {
        console.error("计算总价时发生错误：", error);
      }
    },

    // 安全的数字解析方法
    safeParseNumber(str) {
      if (!str || typeof str !== 'string') return 0;

      // 移除所有非数字字符（除了小数点和负号）
      const cleanStr = str.replace(/[^\d.-]/g, '');
      const num = parseFloat(cleanStr);

      return isNaN(num) ? 0 : Math.max(0, num); // 确保非负数
    },

    // 异常代码中替换原 updateTotalPriceInTable 方法
    updateTotalPriceInTable(row, totalPriceStr) {
      const tableRef = this.$refs[this.refKeys[0]];
      if (!tableRef) {
        console.error("表格引用不存在");
        return;
      }

      // 优先用组件原生 API 更新，确保组件感知变化
      if (tableRef.setValues) {



        tableRef.setValues([{
          rowKey: row.id,
          values: { totalPrice: totalPriceStr }
        }]);
      } else if (tableRef.setCellValue) {
        const rowIndex = this.cwZfcgbTable.dataSource.findIndex(item => item.id === row.id);
        if (rowIndex !== -1) {
          tableRef.setCellValue(rowIndex, 'totalPrice', totalPriceStr);
        }
      }

      // 用 $nextTick 同步 dataSource，避免时机问题
      this.$nextTick(() => {
        const dataIndex = this.cwZfcgbTable.dataSource.findIndex(item => item.id === row.id);
        if (dataIndex !== -1) {
          this.$set(this.cwZfcgbTable.dataSource[dataIndex], 'totalPrice', totalPriceStr);
        }
      });
    },
    addBefore() {
      this.cwZfcgbTable.dataSource = [];
      this.$nextTick(() => {
        const defaultRow = {
          id: Date.now().toString(),
          assetName: '',
          quantity: '0',
          jldw: '',
          univalence: '0.0',
          totalPrice: '0.00',
        };
        this.cwZfcgbTable.dataSource.push(defaultRow);
        // calcTotalPrice 只需要传 row
        this.calcTotalPrice(defaultRow);
      });
    },

    getAllTable() {
      let values = this.tableKeys.map(key => getRefPromise(this, key))
      return Promise.all(values)
    },
    editAfter() {
      this.$nextTick(() => { })
      if (this.model.id) {
        let params = { id: this.model.id }
        getAction(this.url.cwZfcgb.list, params).then(res => {
          if (res.success) {
            this.cwZfcgbTable.dataSource = res.result.records || []
          }
        }).finally(() => {
          this.cwZfcgbTable.loading = false
        })
      }
    },
    validateSubForm(allValues) {
      return new Promise((resolve, reject) => {
        Promise.all([]).then(() => {
          resolve(allValues)
        }).catch(e => {
          if (e.error === VALIDATE_NO_PASSED) {
            this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
          } else {
            console.error(e)
          }
        })
      })
    },
    classifyIntoFormData(allValues) {
      let main = Object.assign(this.model, allValues.formValue)
      return {
        ...main,
        cwZfcgbList: allValues.tablesValue[0].values,
      }
    },
    validateError(msg) {
      this.$message.error(msg)
    },
    close() {
      this.visible = false
      this.$emit('close')
      if (this.$refs.form) {
        this.$refs.form.clearValidate();
      }
    },
    async handleYearChange(year) {
      // 清空逻辑：未选择年度时，保留单位，清空其他数据
      if (!year) {
        this.model = { unit: this.model.unit }
        this.cwZfcgbTable.dataSource = []
        return
      }

      // 加载状态：主表+子表同时加载
      this.confirmLoading = true
      this.cwZfcgbTable.loading = true

      try {
        // 1. 调用年度查询接口
        const yearResponse = await getAction(this.url.getByYear, { year })

        if (yearResponse.success && yearResponse.result.records.length > 0) {
          const mainRecord = yearResponse.result.records[0]
          // 主表数据回显：保留用户已选的unit和year，合并接口返回的其他字段
          this.model = {
            ...this.model,
            ...mainRecord
          }

          // 2. 使用返回的mainId调用政府采购表列表接口
          if (mainRecord.id) {
            const zfcgResponse = await getAction(this.url.cwZfcgb.list, {
              id: mainRecord.id
            })

            if (zfcgResponse.success) {
              this.cwZfcgbTable.dataSource = zfcgResponse.result.records || []
            } else {
              this.$message.warning('获取政府采购表数据失败：' + (zfcgResponse.message || '未知错误'))
              this.cwZfcgbTable.dataSource = []
            }
          } else {
            this.$message.warning('未获取到政府采购表关联ID，无法加载数据')
            this.cwZfcgbTable.dataSource = []
          }
        } else {
          // 接口返回失败（如无数据），显示警告并清空子表
          this.$message.warning(yearResponse.message || '该年度暂无数据')
          this.cwZfcgbTable.dataSource = []
          this.model.id = undefined;

        }
      } catch (error) {
        // 异常处理
        console.error('查询接口异常：', error)
        this.$message.error('查询失败，请刷新页面重试或联系管理员')
        this.cwZfcgbTable.dataSource = []
      } finally {
        // 关闭加载状态（无论成功/失败）
        this.confirmLoading = false
        this.cwZfcgbTable.loading = false
      }
    }
  }
}
</script>

<style scoped></style>